#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

/*
在讲解 static 和 extern 之前再讲一下:作用域和生命周期。
作用域(scope)是程序设计概念，通常来说，一段程序代码中所用到的名字并不总是有效(可用)的，而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程(项目)。

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
1.局部变量的生命周期是:进入作用域变量创建，生命周期开始，出作用域生命周期结束。
2.全局变量的生命周期是:整个程序的生命周期。
*/

//======================================================

//全局变量
//int a = 10;
//在不同文件中引用同一个全局变量需要使用 extern 关键字

//声明来自外部文件的符号
//extern int a;
//
//int main()
//{
//
//	printf("1、%d\n", a);
//	
//	return 0;
//}

//========================================================

//static
//static可以修饰：局部变量、全局变量、函数、结构体、枚举、typedef


//------------------------------------------------------
////static 修饰局部变量
// 
////static修饰局部变量改变了变量的生命周期，生命周期改变的本质是改变了变量的存储类型，
////本来一个局部变量是存储在内存的栈区的，但是被 static 修饰后存储到了静态区。
////存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了，只有程序结束，变量才销毁，内存才回收。但是作用域不变的。
// 
//void test01()
//{
//	int a = 1;
//	a++;
//	printf("%d ", a);
//}
//
//void test02()
//{
//	static int a = 1; //static修饰局部变量，static修饰的局部变量在函数调用结束后不会被销毁
//	a++;
//	printf("%d ", a);
//}
////如果想让变量生命周期延长到整个程序，需要使用 static 修饰
////static 只改变生命周期，不会改变作用域
////如果一个变量出了作用域之后还想保留值，下次继续使用，需要使用 static 修饰
//
//int main()
//{
//	for (int i = 0; i < 5; i++)
//	{
//		test01();
//	}
//	printf("\n");
//
//    for (int i = 0; i < 5; i++)
//	{
//		test02();
//	}
//
//	return 0;
//}

//------------------------------------------------------
//static 修饰全局变量

//一个全局变量被static修饰，使得这个全局变量只能在本源文件内使用，不能在其他源文件内使用。
// 本质原因是全局变量默认是具有外部链接属性的，在外部的文件中想使用，只要适当的声明就可以使用;
// 但是全局变量被 static 修饰之后，外部链接属性就变成了内部链接属性，只能在自己所在的源文件内部使用了，其他源文件，即使声明了，也是无法正常使用的。
//使用建议:如果一个全局变量，只想在所在的源文件内部使用，不想被其他文件发现，就可以使用static修饰.

//extern int g_a;
//
//int main()
//{
//	printf("%d\n", g_a);
//
//	return 0;
//}

//------------------------------------------------------
//static 修饰函数

extern int Add(int a, int b);
//函数是具有外部连接属性的
//函数被static修饰之后，外部链接属性就变成了内部链接属性，其他源文件，即使声明了，也是无法正常使用的。
/*
static 修饰函数和 static 修饰全局变量是一模一样的，一个函数在整个工程都可以使用，被 static 修饰后，只能在本文件内部使用，其他文件无法正常的链接使用了。
本质是因为函数默认是具有外部链接属性，具有外部链接属性，使得函数在整个工程中只要适当的声明就可以被使用。
但是被 static 修饰后变成了内部链接属性，使得函数只能在自己所在源文件内部使用。
使用建议:一个函数只想在所在的源文件内部使用，不想被其他源文件使用，就可以使用 static 修饰。
*/

int main()
{
	int a = 10;
	int b = 20;

	int r = Add(a, b);
    printf("%d\n", r);

	return 0;
}